﻿/**
 * Create in 2012-2-5.
 */
package kit4j.generator.keyed;

import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.util.LinkedList;
import java.util.List;

/**
 * 随机字体生成器，每次随机生成一个能显示指定字符串的字体。
 * 
 * @author MiniKnife
 * 
 */
public class RandomFontKeyedGenerator implements IKeyedGenerator<String, Font> {

	/**
	 * 当前系统图形环境中的所有字体。
	 */
	private static final Font[] ALL_FONTS = GraphicsEnvironment
			.getLocalGraphicsEnvironment().getAllFonts();

	private RandomPositiveIntegerKeyedGenerator numberGenerator;
	
	/**
	 * 创建一个随机字体生成器。
	 */
	public RandomFontKeyedGenerator() {
		numberGenerator = new RandomPositiveIntegerKeyedGenerator();
	}

	/**
	 * 下一个随机的能显示指定字符串中所有字符的字体(如果有)。
	 * 
	 * @param str
	 *            要指示显示的字符串
	 * @return 能显示指定字符串的字体，如果当前系统中不存在这样的字体，则返回null。
	 * 
	 * @see kit4j.generator.keyed.IKeyedGenerator#next(java.lang.Object)
	 */
	@Override
	public Font next(String str) {
		Font[] fonts = getCanDisplayFonts(str);

		if (fonts.length == 0) {
			return null;
		} else {
			return fonts[numberGenerator.next(fonts.length)];
		}
	}

	/**
	 * 得到当前系统中所有能显示指定字符串中所有字符的字体。
	 * 
	 * @param str
	 *            要指示显示的字符串
	 * @return 字体的数组
	 */
	protected Font[] getCanDisplayFonts(String str) {
		List<Font> fonts = new LinkedList<Font>();
		char[] chars = str.toCharArray();

		for (Font f : ALL_FONTS) {
			if (f.canDisplayUpTo(chars, 0, chars.length) == -1) {
				fonts.add(f);
			}
		}

		return fonts.toArray(new Font[0]);
	}

}
